package com.example.an.teachmusic;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class MyService extends Service {

    //播放控制命令，标识操作
    public static final int COMMAND_UNKOWN=-1;
    public static final int COMMAND_PLAY = 0;
    public static final int COMMAND_PAUSE = 1;
    public static final int COMMAND_STOP = 2;
    public static final int COMMAND_RESUME = 3;
    public static final int COMMAND_PREVIOUS = 4;
    public static final int COMMAND_NEXT = 5;
    public static final int COMMAND_CHECK_IS_PLAYING = 6;
    public static final int COMMAND_SEEK_TO = 7;
    //播放器状态
    public static final int STATUS_PLAYING = 0;
    public static final int STATUS_PAUSED = 1;
    public static final int STATUS_STOPPED = 2;
    public static final int STATUS_COMPLETED = 3;

    // 广播标志
    public static final String BROADCAST_MUSICSERVICE_CONTROL = "MusicService.ACTION_CONTROL";
    public static final String BROADCAST_MUSICSERVICE_UPDATE_STATUS = "MusicService.ACTION_UPDATE";
    //歌曲序号，从0开始
    private int number = 0;
    private int status;
    //播放媒体类
    private MediaPlayer player=new MediaPlayer();

    // 广播接收器
    private CommandReceiver receiver;

    private boolean phone = false;
    @Override
    public void onCreate() {
        super.onCreate();
        // 绑定广播接收器，可以接收广播
        bindCommandReceiver();
        status=MyService.STATUS_STOPPED;
       TelephonyManager telephonyManager= (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        telephonyManager.listen(new MyphoneListener(),PhoneStateListener.LISTEN_CALL_STATE);
    }

    private final class MyphoneListener extends PhoneStateListener{
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
           switch (state){
               case TelephonyManager.CALL_STATE_RINGING:
                   if (state==MyService.STATUS_PLAYING){
                       pause();
                       phone=true;
                   }
                   break;
               case TelephonyManager.CALL_STATE_IDLE:
                   if(phone==true){
                       resume();
                       phone=false;
                   }
                   break;
           }
        }
    }

    @Override
    public void onDestroy() {
        if(player!=null){
            player.release();
        }
        super.onDestroy();
    }


    public MyService() {
    }
    /** 绑定广播接收器*/
    private void bindCommandReceiver(){
        receiver=new CommandReceiver();
        IntentFilter filter=new IntentFilter(BROADCAST_MUSICSERVICE_CONTROL);
        registerReceiver(receiver,filter);
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
    /** 内部类，接收广播命令，并执行操作*/
    class CommandReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            //获取命令
            int command=intent.getIntExtra("command", COMMAND_UNKOWN);
            //执行命令
            switch(command){
                case COMMAND_SEEK_TO:
                    seekTO(intent.getIntExtra("time",0));
                    break;
                case COMMAND_PLAY:
                    number=intent.getIntExtra("number",0);
                    play(number);
                    break;
                case COMMAND_PREVIOUS:
                    moveNumberToPrevious();
                    break;
                case COMMAND_NEXT:
                    moveNumberToNext();
                    break;
                case COMMAND_PAUSE:
                    pause();
                    break;
                case COMMAND_STOP:
                    stop();
                    break;
                case COMMAND_RESUME:
                    resume();
                case COMMAND_CHECK_IS_PLAYING:
                    if (player!=null&&player.isPlaying()){
                        sendBroadcastOnStatusChanged(MyService.STATUS_PLAYING);
                    }
            }
        }
    }

    /** 发送广播，提醒状态改变了*/
    private void sendBroadcastOnStatusChanged(int status){
        Intent intent=new Intent(BROADCAST_MUSICSERVICE_UPDATE_STATUS);
        intent.putExtra("status",status);
        if(status!=STATUS_STOPPED){
            intent.putExtra("time",player.getCurrentPosition());
            intent.putExtra("duration",player.getDuration());
            intent.putExtra("number",number);
            intent.putExtra("musicName",MusicList.getMusicList().get(number).getmusicName());
            intent.putExtra("musicAritist",MusicList.getMusicList().get(number).getmusicArtist());
        }
        sendBroadcast(intent);
    }
    /** 读取音乐文件*/
    private void load(int number){
        try {
            player.reset();
            player.setDataSource(MusicList.getMusicList().get(number).getmusicPath());
            player.prepare();
        }catch (Exception e){
            e.printStackTrace();
        }
        //注册监听器
        player.setOnCompletionListener(completionListener);
    }
    //播放结束监听器
    MediaPlayer.OnCompletionListener completionListener=new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        if(player.isLooping()){
            replay();
        }else {
         sendBroadcastOnStatusChanged(MyService.STATUS_COMPLETED);
        }
    }
};
    /** 选择下一首*/
    private void moveNumberToNext() {
        // 判断是否到达列表底端
        if ((number ) == MusicList.getMusicList().size()-1) {
            Toast.makeText(MyService.this, "已达到列表底端", Toast.LENGTH_SHORT).show();
        } else {
            ++number;
            play(number);
        }
    }
    /** 选择上一首*/
    private void moveNumberToPrevious() {
        // 判断是否到达列表顶端
        if (number == 0) {
            Toast.makeText(MyService.this,"已达到列表顶端",Toast.LENGTH_SHORT).show();
        } else {
            --number;
            play(number);
        }
    }
    /** 播放音乐*/
    private void play(int number) {
        // ֹֹͣͣ停止当前播放
        if (player != null && player.isPlaying()) {
            player.stop();
        }
        load(number);
        player.start();
        status = MyService.STATUS_PLAYING;
        sendBroadcastOnStatusChanged(MyService.STATUS_PLAYING);
    }
    /** 暂停音乐*/
    private void pause() {
        if (player.isPlaying()) {
            player.pause();
            status = MyService.STATUS_PAUSED;
            sendBroadcastOnStatusChanged(MyService.STATUS_PAUSED);
        }
    }

    /** 停止播放*/
    private void stop() {
        if (status != MyService.STATUS_STOPPED) {
            player.stop();
            status = MyService.STATUS_STOPPED;
            sendBroadcastOnStatusChanged(MyService.STATUS_STOPPED);
        }
    }
    /** 恢复播放（暂停之后）*/
    private void resume() {
        player.start();
        status = MyService.STATUS_PLAYING;
        sendBroadcastOnStatusChanged(MyService.STATUS_PLAYING);
    }
    /** 重新播放（播放完成之后）*/
    private void replay() {
        player.start();
        status = MyService.STATUS_PLAYING;
        sendBroadcastOnStatusChanged(MyService.STATUS_PLAYING);
    }

    private void seekTO(int time){
        player.seekTo(time);
    }
}
